package study

import "fmt"

func Pointer() {
	// --------------------------------------------------- 内存 ---------------------------------------------------
	// 堆                        栈
	// 引用类型                   值类型

	// 1.值类型都有对应的指针类型, 形式为 *数据类型; 如: int 对应的指针类型 *int
	// 2.值类型: 基本数据类型(int 系列, float 系列, bool, string), 数组, 结构体(struct) // 变量存的就是值, 也叫值类型
	//   2.1 值类型通常在 栈 中
	// 3.引用类型: 指针, 切片(slice), map, 管道(channel), interface 等
	//   3.1 引用类型通常在 堆 中

	// 1.基本数据类型: 变量存的就是值, 也叫值类型
	// 2.获取变量的地址用 &; 如: var i int 获取 i 的地址: &i
	// 3.指针类型: 变量存的是一个地址, 地址指向的空间才是值; 如: var ptr *int = &i
	// 4.获取指针类型所指向的值使用 *; 如: var ptr *int; 使用 *ptr 获取 ptr 指向的值
	i := 1
	ptr := &i                                                    // 将 i 的地址赋值给 ptr
	fmt.Printf("i: %d, &i: %d\n", i, &i)                         // i: 1, &i: 824633811096
	fmt.Printf("*ptr: %d, ptr: %d; &ptr: %d\n", *ptr, ptr, &ptr) // *ptr: 1, ptr: 824633811096; &ptr: 824633761832
	*ptr = 10                                                    // 通过 *ptr 拿到 i 所在的值
	fmt.Printf("通过 ptr 修改后的 i: %d\n", i)                         // 通过 ptr 修改后的 i: 10
}
